接下來我們要進入所謂的『 DataSource 』層,我相信應該有不少人提過這些名詞 :
事實上還有不少,接下來我們來一個一個慢慢來的理解它們的原始定義。
首先我們先從書中的 『 Table Data Gateway 』開始說起。
根據書中的定義為 :
A Table Data Gateway holds all the SQL for accessing a single table or view: selects, inserts, updates, and deletes. Other code calls its methods for all interaction with the database.
這裡我個人理解的意思為 :
就是一個專門用來操作資料庫表與視圖的地方,然後他只會做簡單對資料庫的操作,例如 Select, Update 之類。
然後書中有提到幾個重點 :
TableDataGateway 適合與 table module 與 transaction script
事實上我現在還不能說很理解為什麼 domain model 就不適合,就我的理解幾乎可以說是一行資料對應一個 domain model 實體,但應該還是適用於 tableDataGateway ,為什麼呢 ? 希望之後的文章可以理解。
對了,然後我還有想到一個問題
然後我在 stackoverflow 找到一個回答,我覺得可以參考看看。
If you imagine yourself ever wanting to JOIN this table with another, don't use this pattern. Since the entire point of a relational model is to preserve the relationships between data, in practice it is usually avoided.
然後事實上我還有想到一個問題 :
TableDataGateway 回傳的東西是什麼呢 ?
以書中範例他是以 c# 來撰寫,然後他 select 部份回傳的為 IDateReader,但那應該是屬於 ADO.NET 所提供的東西,但如果是其它語言,到底是以什麼東為回傳呢 ?
這個範例我們以下層級來分 :
然後程式碼就挺簡單的,就是 PersonTableModule 處理業務 register,然後透過 PersonDataGateway 來操作資料庫。
class PersonDataGateway{
update(): void{
console.log('UPDATE SQL OPERATION')
}
insert(username: string, email: string): void{
console.log('INSERT SQL OPERATION')
}
selectById(id: string){
console.log('SELECT * FROM Person WHERE id=xx')
}
selectByName(name: string){
console.log('SELECT * FROM Person WHERE name=xx')
}
}
class PersonTableModule{
personDataGateway: PersonDataGateway
constructor(personDataGateway: PersonDataGateway){
this.personDataGateway = personDataGateway
}
register(username: string, email: string){
const user = this.personDataGateway.selectByName(username)
if(user.email === email) throw Error('The email has registered')
this.personDataGateway.insert(username, email)
}
}
想不到呢……
這個模式與我第一份工作時所看到的分層中的 dao 層很像,就是專門處理 sql 操作,會將所有 sql 不帶業務邏輯的東西放在此處。
但這樣的話 Dao 和 TableDataGateway 又有什麼差別呢 ?
我有上網找了一下,然後看到以下兩部份的說明
A TableDataGateway is "a Gateway (object that encapsulates access to an external system or resource) to a database table. One instance handles all the rows in the table"
A DAO "separates a data resource's client interface from its data access mechanisms / adapts a specific data resource's access API to a generic client interface" allowing "data access mechanisms to change independently of the code that uses the data"
但我好像還是不太懂呢……
請問 "就是一個專門用來操作資料庫表與視圖的地方,然後他只會做簡單對資料庫的操作,而不進行所謂的商業邏輯,例如 Select, Update 之類。" 這句的結論是怎麼得到的呢?
按照您quote下來的意思,A Table Data Gateway holds all the SQL for accessing...比較像是所有對資料庫的操作都要經過TableDataGateway。
A Table Data Gateway has a simple interface, usually consisting of several find methods to get data from the database and update, insert, and delete methods. Each method maps the input parameters into a SQL call and executes the SQL against a database connection.The Table Data Gateway is usually stateless, as its role is to push data back and forth.
我當初主要是根據,原文中的這一段來判斷,裡面的方法只能代 sql 要用的參數,但我覺得你說的也有理……
因為假設他的 sql 是有業務邏輯,那這裡就有問題了…
我修改一下我上面文字的說法好了 ~ 剛蝦